package com.ruoyi.web.service.Impl;

import java.math.BigDecimal;
import java.util.HashMap;
import java.util.List;

import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.pinyin.PinYinUtils;
import com.ruoyi.web.domain.MesAllotInfo;
import com.ruoyi.web.domain.mes.*;
import com.ruoyi.web.domain.vo.MaterialInVo;
import com.ruoyi.web.domain.vo.MaterialUseVo;
import com.ruoyi.web.mapper.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.Map;
import java.util.stream.Collectors;

import com.ruoyi.common.utils.StringUtils;
import org.springframework.transaction.annotation.Transactional;
import com.ruoyi.web.service.IMesMaterialUseService;

import javax.annotation.Resource;

/**
 * 物料领用Service业务层处理
 *
 * @author levicash
 * @date 2024-01-29
 */
@Service
public class MesMaterialUseServiceImpl implements IMesMaterialUseService {
    @Resource
    private MesMaterialUseMapper mesMaterialUseMapper;

    @Resource
    private MesMaterialInMapper mesMaterialInMapper;

    @Resource
    private MesMaterialMapper mesMaterialMapper;

    @Resource
    private MesMaterialMachineMapper mesMaterialMachineMapper;

    @Resource
    private MesConfigMapper configMapper;


    /**
     * 查询物料领用
     *
     * @param id 物料领用主键
     * @return 物料领用
     */
    @Override
    public MesMaterialUse selectMesMaterialUseById(Long id) {
        return mesMaterialUseMapper.selectMesMaterialUseById(id);
    }

    /**
     * 查询物料领用列表
     *
     * @param mesMaterialUse 物料领用
     * @return 物料领用
     */
    @Override
    public List<MesMaterialUse> selectMesMaterialUseList(MesMaterialUse mesMaterialUse) {
        return mesMaterialUseMapper.selectMesMaterialUseList(mesMaterialUse);
    }

    /**
     * 新增物料领用
     *
     * @param mesMaterialUse 物料领用
     * @return 结果
     */
    @Transactional
    @Override
    public int insertMesMaterialUse(MesMaterialUse mesMaterialUse) {
        mesMaterialUse.setCreateTime(DateUtils.getNowDate());
        mesMaterialUse.setCreateBy(SecurityUtils.getUsername());
        // 生成领用单编号
        Map<String, Object> map = new HashMap<>();
        map.put("columnName", "code");
        map.put("tableName", "mes_material_use");
        int maxNum = configMapper.getMaxId(map);
        String code = PinYinUtils.getCodeNormal(maxNum, "WLLYD");
        mesMaterialUse.setCode(code);
        int rows = mesMaterialUseMapper.insertMesMaterialUse(mesMaterialUse);
        insertMesMaterialUsedetail(mesMaterialUse);
        return rows;
    }

    /**
     * 修改物料领用
     *
     * @param mesMaterialUse 物料领用
     * @return 结果
     */
    @Transactional
    @Override
    public int updateMesMaterialUse(MesMaterialUse mesMaterialUse) {
        mesMaterialUse.setUpdateTime(DateUtils.getNowDate());
        mesMaterialUse.setUpdateBy(SecurityUtils.getUsername());
        int status = mesMaterialUse.getStatus();
        if (status == 1) {// 提交
            // 修改物料入库明细的仓库数量(减库存)
            MesMaterialUse Info = mesMaterialUseMapper.selectMesMaterialUseById(mesMaterialUse.getId()); // 查询数据库
            List<MesMaterialUsedetail> mesMaterialUsedetailList = Info.getMesMaterialUsedetailList();
            if (mesMaterialUsedetailList.size() > 0) {
                // 获取关联ids
                List<Long> listId = mesMaterialUsedetailList.stream().map(it -> it.getMaterialId()).collect(Collectors.toList());
                Long[] ids = listId.toArray(new Long[0]);
                // 根据关联ids查询物料明细
                List<MesMaterial> detailList = mesMaterialMapper.selectMesMaterialByIds(ids);
                // 遍历明细修改库存
                for (MesMaterialUsedetail mesMaterialUsedetail : mesMaterialUsedetailList) {
                    for (MesMaterial detailItem : detailList) {
                        if (detailItem.getId().equals(mesMaterialUsedetail.getMaterialId())) {
                            BigDecimal stockNum = (detailItem.getQuantity() == null ? BigDecimal.ZERO : detailItem.getQuantity()); // 库存数量
                            BigDecimal quantity = mesMaterialUsedetail.getQuantity(); // 领用数量
                            int result = stockNum.compareTo(quantity);
                            if (result < 0) {
                                throw new ServiceException("领用数量大于库存数量！");
                            } else {
                                BigDecimal difference = stockNum.subtract(quantity);
                                detailItem.setQuantity(difference);         // 更改库存数量
                                detailItem.setStockPrice(difference.multiply(detailItem.getRealtimePrice()));  // 更改金额

                                // 新增或者修改(存在更新不存在新增),物料库存机台库存关联表中物料对应的机台数量
                                MesMaterialMachine mesMaterialMachine = new MesMaterialMachine();
                                mesMaterialMachine.setMaterialId(detailItem.getId());
                                mesMaterialMachine.setMachineId(mesMaterialUse.getMachineId());
                                List<MesMaterialMachine> listMaterialMachine = mesMaterialMachineMapper.selectMesMaterialMachineList(mesMaterialMachine);
                                if (listMaterialMachine.size() > 0) {
                                    BigDecimal machineStock = listMaterialMachine.get(0).getMachineStock();
                                    BigDecimal temp = machineStock.add(quantity);
                                    mesMaterialMachine.setMachineStock(temp);
                                    mesMaterialMachine.setId(listMaterialMachine.get(0).getId());
                                    mesMaterialMachineMapper.updateMesMaterialMachine(mesMaterialMachine);
                                } else {
                                    mesMaterialMachine.setMachineStock(quantity);
                                    mesMaterialMachineMapper.insertMesMaterialMachine(mesMaterialMachine);
                                }
                            }
                        }
                    }
                }
                // 批量修改物料明细库存
                mesMaterialMapper.updateStockNumByBatch(detailList);
            }
        } else {
            mesMaterialUseMapper.deleteMesMaterialUsedetailByMaterialuseId(mesMaterialUse.getId());
            insertMesMaterialUsedetail(mesMaterialUse);
        }

        return mesMaterialUseMapper.updateMesMaterialUse(mesMaterialUse);
    }

    /**
     * 批量删除物料领用
     *
     * @param ids 需要删除的物料领用主键
     * @return 结果
     */
    @Transactional
    @Override
    public int deleteMesMaterialUseByIds(Long[] ids) {
        mesMaterialUseMapper.deleteMesMaterialUsedetailByMaterialuseIds(ids);
        return mesMaterialUseMapper.deleteMesMaterialUseByIds(ids);
    }

    /**
     * 删除物料领用信息
     *
     * @param id 物料领用主键
     * @return 结果
     */
    @Transactional
    @Override
    public int deleteMesMaterialUseById(Long id) {
        mesMaterialUseMapper.deleteMesMaterialUsedetailByMaterialuseId(id);
        return mesMaterialUseMapper.deleteMesMaterialUseById(id);
    }

    /**
     * 新增物料领用明细信息
     *
     * @param mesMaterialUse 物料领用对象
     */
    public void insertMesMaterialUsedetail(MesMaterialUse mesMaterialUse) {
        List<MesMaterialUsedetail> mesMaterialUsedetailList = mesMaterialUse.getMesMaterialUsedetailList();
        Long id = mesMaterialUse.getId();
        if (StringUtils.isNotNull(mesMaterialUsedetailList)) {
            List<MesMaterialUsedetail> list = new ArrayList<MesMaterialUsedetail>();
            for (MesMaterialUsedetail mesMaterialUsedetail : mesMaterialUsedetailList) {
                mesMaterialUsedetail.setCreateBy(SecurityUtils.getUsername());
                mesMaterialUsedetail.setCreateTime(DateUtils.getNowDate());
                mesMaterialUsedetail.setMaterialuseId(id);
                list.add(mesMaterialUsedetail);
            }
            if (list.size() > 0) {
                mesMaterialUseMapper.batchMesMaterialUsedetail(list);
            }
        }
    }

    /**
     * 查询物料领用明细
     *
     * @param map 查询参数
     * @return 物料领用关联集合
     */
    @Override
    public List<MaterialUseVo> selectMesMaterialUseDetailList(Map<String, Object> map) {
        return mesMaterialUseMapper.selectMesMaterialUseDetailList(map);
    }
}
